package com.mercycrazy.mq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 构建简单模式的生产者, 发送消息
 *
 * @author <a href="mailto:1443424326@qq.com">mercycrazy</a>
 * @since 2023-01-19
 */
public class FooProducer {

    public static void main(String[] args) throws Exception {

        // 1. 创建连接工厂以及参数配置
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2. 创建连接 Connection
        Connection connection = factory.newConnection();

        // 3. 创建管道 Channel
        Channel channel = connection.createChannel();

        // 4. 创建队列 Queue (简单模式不需要交换机 Exchange)
        // 如果队列已存在, 不会重复创建
        // queue: 队列名
        // durable: 是否持久化, true: 重启后, 队列依然存在, 否则不存在
        // exclusive: 是否独占, true: 只能有一个消费者监听这个队列, 一般设置为 false
        // autoDelete: 是否自动删除, true: 当没有消费者的时候, 自动删除队列
        // arguments: map 类型其他参数
        channel.queueDeclare("hello", true, false, false, null);

        // 5. 向队列发送消息
        String message = "Hello Rabbit~";
        // exchange: 交换机名称, 简单模式没有, 直接设置为 ""
        // routingKey: 路由 key, 映射路径, 如果交换机是默认 "", 则路由 key 和队列名一致
        // props: 配置信息
        // body: 消息数据
        channel.basicPublish("", "hello", null, message.getBytes());

        // 6. 释放
        channel.close();
        connection.close();
    }
}
